package com.cmcc.volte.xdr.XDRUtil;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import dk.i1.diameter.AVP;

public class XMLReader {

	public static Map<Integer, AVP> readXMLFile2List(String file) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = null;
		try {
			builder = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e1) {
			e1.printStackTrace();
		}
		AVP avp;
		// Map<Integer, String> enumavpMap = new HashMap<Integer, String>();
		Map<Integer, AVP> avpMap = new HashMap<Integer, AVP>();
		Document doc = null;
		try {
			doc = builder.parse(file);
		} catch (SAXException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		} // 获取到xml文件
			// 下面开始读取
		Element root = doc.getDocumentElement(); // 获取根元素
		NodeList avps = root.getElementsByTagName("avp");

		for (int i = 0; i < avps.getLength(); i++) {
			// 一次取得每一个avp元素
			Element avpElement = (Element) avps.item(i);
			// log.debug(avpElement.getAttribute("code"));
			// 创建一个avp的实例
			avp = new AVP();
			avp.setCode(Integer.parseInt(avpElement.getAttribute("code")));
			// 获取name元素
			NodeList names = avpElement.getElementsByTagName("name");
			Element nameElement = (Element) names.item(0);
			Node name = nameElement.getFirstChild();
			avp.setAvp_name(name.getNodeValue());
			// log.debug(name.getNodeValue());
			// 获取datatype元素
			NodeList datatypes = avpElement.getElementsByTagName("datatype");
			Element datatypeElement = (Element) datatypes.item(0);
			Node datatype = datatypeElement.getFirstChild();
			avp.setAvp_datatype(datatype.getNodeValue());
			// log.debug(datatype.getNodeValue());
			// 获取EnumVal元素
			if (datatype.getNodeValue().equals("Enumerated")) {
				// avp.setEnumavpMap(null);

				// if (avpElement.getElementsByTagName("EnumVal") != null){
				NodeList EnumVals = avpElement.getElementsByTagName("EnumVal");
				Map<Integer, String> enumavpMap = new HashMap<Integer, String>();
				for (int j = 0; j < EnumVals.getLength(); j++) {

					Element EnumElement = (Element) EnumVals.item(j);
					// 获取EnumVal下的value元素
					NodeList values = EnumElement.getElementsByTagName("values");
					Element valueElement = (Element) values.item(0);
					Node value = valueElement.getFirstChild();
					enumavpMap.put(Integer.parseInt(EnumElement.getAttribute("num")), value.getNodeValue());

				}
				avp.setEnumavpMap(enumavpMap);
				// log.debug(avp.getEnumavpMap());
			}
			avpMap.put(avp.getCode(), avp);
		}
		return avpMap;
	}

}